package jp.co.technotree.common.util;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.math.BigDecimal;

import javax.imageio.ImageIO;

public class FwCom {
	private static String CLASSNAME = FwCom.class.getName();
	
    /**
     * 渡された文字列がnullか空文字("")であれば空文字を返す
     * @param strString 編集文字列
     * @return String 編集後文字列
     */
    public static String nullToBlank(Object strString) {
        if (strString == null) {
            return "";
        }
        else {
        	if (strString.toString().length() <= 0) {
                return "";
            }
        	else {
                return strString.toString();
            }
        }
    }
    /**
     * 渡された文字列がnullか空文字("")であれば空文字を返す
     * @param strString 編集文字列
     * @return String 編集後文字列
     */
    public static String nullToNbsp(Object strString) {
        if (strString == null) {
            return "&nbsp";
        }
        else {
        	if (strString.toString().length() <= 0) {
                return "&nbsp";
            }
        	else {
                return strString.toString();
            }
        }
    }
    public static BigDecimal nullToDecimal(BigDecimal strString) {
        if (strString == null) {
            return new BigDecimal("0");
        }
        else {
        	if (strString.toString().length() <= 0) {
                return new BigDecimal("0");
            }
        	else {
        		
                return strString;
            }
        }
    }
    /**
     * 渡された文字列がnullか空文字("")であれば"ゼロ"を返す
     * @param strString 編集文字列
     * @return String 編集後文字列
     */
    public static String nullToZero(Object strString) {
        if (strString == null) {
            return "0";
        }
        else {
        	if (strString.toString().length() <= 0) {
                return "0";
            }
        	else {
                return strString.toString();
            }
        }
    }
    
    /**
     * 渡された文字列がnullか空文字("")であれば"ゼロ"を返す
     * @param strString 編集文字列
     * @return String 編集後文字列
     */
    public static int nullToIntZero(Object strString) {
        if (strString == null) {
            return 0;
        }
        else {
        	if (strString.toString().length() <= 0) {
                return 0;
            }
        	else {
                return Integer.parseInt(strString.toString());
            }
        }
    }
    
	/**
     * 渡された文字列がnullか空文字("")であれば指定文字列を返す
     * @param strString 編集文字列
     * @param str       編集文字列
     * @return String 編集後文字列
     */
    public static String nullToStr(Object strString, String str) {
        if (str == null || str.length() <= 0) {
            str = "";
        }

        if (strString == null) {
            return str;
        }
        else {
        	if (strString.toString().length() <= 0) {
                return str;
            }
        	else {
                return strString.toString();
            }
        }
    }
    
    /**
	 * 文字列が null 又は空文字かどうかをチェックする。
	 * @param str チェック対象文字列
	 * @return nullまたは""：true、nullまたは""でない：false
	 */
	public static boolean isEmpty(String str) {
		return (str == null || str.length() == 0);
	}
	
	/**
	 * 文字列配列の要素が存在しない、又は要素すべてが空白かどうかをチェックする。
	 * @param str チェック対象文字列配列
	 * @return nullまたは要素が全て""：true、nullまたは""でない：false
	 */
	public static boolean isEmpty(String[] str) {
		if (str == null) {
			return true;
		}
		for (int i = 0; i < str.length; i++) {
			if (!isEmpty(str[i])) {
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 引数を文字、数字判別
	 * @param strValue
	 * @return
	 */
	public static boolean isNumeric(String strValue) { 
		try	{ 
			Integer.parseInt(strValue); 
		}catch (Exception NumberFormatException) { 
			return false; 
		} 
			return true;
	} 
	
	
	/**
	 * 
	 * @param newOrderCnt
	 * @return
	 */
	public static float getHex(String newOrderCnt){
		
		int loopCnt =  newOrderCnt.length()-1;
		String[] args = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
		String values = null;
		float retResult = 0;
		
		for(int p=0; p <= loopCnt; p++){
			values = newOrderCnt.substring(p,p+1);
			
			if (!"0".equals(values )){
				int y=0;
				
				for(y=0; y<args.length; y++){
					if (args[y].equals(values)){
						break;
					}
				}
				if(p > args.length-1){
					return 0;
				}else{
					//retResult = retResult+(y * (62 ^ (loopCnt-p))); //float ttt = (float) Math.pow(62, 0);
					retResult = retResult+(y *((float) Math.pow(62, loopCnt-p)));
				}
			}
			
			
		}
		return retResult;
	
	}

    /**
     * 文字列の左右の半角・全角のスペースを削除する
     * @param str 編集文字列
     * @return String 編集後文字列
     */
    public static String Trim(String str) {
		// null、空文字は空文字を返す。 
        if (str == null || str.length() <= 0) {
            return "";
        }

        int start = -1;
        for (int i = 0; i < str.length(); i++) {
            if (str.substring(i, i + 1).equals(" ")) {
                continue;
            } else if (str.substring(i, i + 1).equals("　")) {
                continue;
            } else {
                start = i;
                break;
            }
        }

        if (start == -1){
        	return "";
        }
        
        int end = str.length();
        for (int i = str.length(); i > 0; i--) {
            if (str.substring(i - 1, i).equals(" ")) {
                continue;
            } else if (str.substring(i - 1, i).equals("　")) {
                continue;
            } else {
                end = i;
                break;
            }
        }
        return str.substring(start, end);
    }
    /**
     * ファイル存在チェック
     * @param filePath
     * @return
     */
    public static boolean isFileExist(String filePath){
    	File isFile = new File(filePath);
    	return isFile.exists();
    }
    
    /**
     * イメージ変換
     * @param src
     * @param campusWid
     * @param campusHei
     * @return
     */
    public static BufferedImage imageControll(String src, int campusWid, int campusHei){
		String METHODNAME = "imageControll";
		
    	BufferedImage bufferedImage = null;
		try{
			bufferedImage = ImageIO.read(new File(src));
			//------------------------------------------------------
			try {
				//int campusWid=130;   //キャンパスー幅
				//int campusHei=130; //キャンパスー高さ
				int baseWid=bufferedImage.getWidth(); //元ー幅　144
				int baseHei=bufferedImage.getHeight(); //元ー高さ　176
				
				System.out.println("baseWid:"+baseWid);
				System.out.println("baseHei:"+baseHei);
				
				double widParsent = (double)baseWid / campusWid; //幅比率
				double heiParsent = (double) baseHei / campusHei; //高さ比率
				
				System.out.println("widParsent:"+widParsent);
				System.out.println("heiParsent:"+heiParsent);

				//縮小比率
				double maxParsent=0;
				if (widParsent<heiParsent) {
					maxParsent=heiParsent;
				} else {
					maxParsent=widParsent;
				}
				System.out.println("minParsent:"+maxParsent);
				int resizeWid=(int) (baseWid / maxParsent); //リサイズ後ー幅
				int resizeHei=(int) (baseHei / maxParsent); //リサイズ後ー高さ
				
				System.out.println("resizeWid:"+resizeWid);
				System.out.println("resizeHei:"+resizeHei);
				
				
				//縮小
				BufferedImage resizeImg=new BufferedImage(campusWid, campusHei, BufferedImage.TYPE_3BYTE_BGR);
				Graphics2D g2 = resizeImg.createGraphics();
				
				g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BICUBIC);
				double scalex=(double) resizeWid / baseWid;
				double scaley=(double) resizeHei / baseHei;

				//センタリング
				int centerResizeWid=resizeWid/2;
				int centerResizeHei=resizeHei/2;
				int centerCampusWid=campusWid/2;
				int centerCampusHei=campusHei/2;
				int upWid=centerCampusWid-centerResizeWid; //伸ばす量ー幅
				int upHei=centerCampusHei-centerResizeHei;//伸ばす量ー高さ
				
				System.out.println("upWid:"+upWid);
				System.out.println("upHei:"+upHei);
				
				AffineTransform xform = AffineTransform.getScaleInstance(scalex, scaley);
				g2.setColor(Color.WHITE);
				g2.fillRect(0, 0, campusWid, campusHei);

				g2.translate(upWid, upHei);
				
				
				g2.drawRenderedImage(bufferedImage, xform);
				g2.dispose();
				
				bufferedImage=resizeImg;
				
			} catch (Exception e) {
				System.out.println("画像調整で");
				DBGLog.log(CLASSNAME, METHODNAME, "画像サイズ調整でエラー:" + e.toString());
//				e.printStackTrace();
			}
			
			
		} catch (Exception e) {
			System.out.println("画像調整で");
			DBGLog.log(CLASSNAME, METHODNAME, "画像サイズ調整でエラー:" + e.toString());
//			e.printStackTrace();
		}
		return bufferedImage;
    }
    
}